#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <dlfcn.h>
#include <pthread.h>
#include <linux/fb.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "shmhead.h"

char *p; // 共享内存入口指针
pid_t mypid, peerpid;

void rcvdata(int sig)
{
    printf("%s", p);
    // 通知对方数据已处理，可以继续发数据
    // kill(peerpid, SIGUSR2);
}

void cleanfifo(int sig)
{
    remove(FIFO12);
    remove(FIFO21);
    exit(0);
}

int main(int argc, char const *argv[])
{
    // 信号处理注册要放在最前面
    // 注册对方已经发送数据的信号SIGUSR1
    signal(SIGUSR1, rcvdata);
    signal(SIGINT, cleanfifo);

    // 0，互通双方的PID，以便发信号
    mkfifo(FIFO12, 0666);
    mkfifo(FIFO21, 0666);
    int fifo12 = open(FIFO12, O_RDWR);
    int fifo21 = open(FIFO21, O_RDWR);
    mypid = getpid();
    write(fifo21, &mypid, sizeof(mypid));
    read(fifo12, &peerpid, sizeof(peerpid));

    printf("p1: %d\n", mypid);
    printf("p2: %d\n", peerpid);

    // 1， 创建共享内存IPC
    key_t key = ftok(MSGPATH, PROJID);   
    int shmid = shmget(key, 128, IPC_CREAT|0666);

    // 2，将SHM映射到本进程的内存空间
    //    NULL: 让Linux自动为本SHM分配虚拟地址入口
    //    0   : 以读写方式映射
    p = shmat(shmid, NULL, 0);
    if(p == (void*)-1)
    {
        perror("shmat失败");
        exit(0);
    }

    // 3，阻塞等待对方的信号
    while(1)
    {
        pause();
    }

    return 0;
}
